package br.mil.eb.pqrmnt7.scc.controller.jsf.ordemabastecimento;

import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import br.mil.eb.pqrmnt7.scc.controller.jsf.AppMB;
import br.mil.eb.pqrmnt7.scc.controller.jsf.medicaoodometro.MedicaoOdometroMB;
import br.mil.eb.pqrmnt7.scc.entity.MedicaoOdometro;
import br.mil.eb.pqrmnt7.scc.entity.MedicaoOdometroEntity;
import br.mil.eb.pqrmnt7.scc.entity.OrdemAbastecimento;
import br.mil.eb.pqrmnt7.scc.entity.OrdemAbastecimentoEntity;
import br.mil.eb.pqrmnt7.scc.entity.OrdemAbastecimentoException;
import br.mil.eb.pqrmnt7.scc.entity.SituacaoOrdemDeAbastecimento;
import br.mil.eb.pqrmnt7.scc.facade.IOrdemAbastecimento;
import br.mil.eb.pqrmnt7.scc.persistence.jpa.medicaoodometro.MedicaoOdometroDAO;

import com.powerlogic.jcompany.commons.PlcConstants;
import com.powerlogic.jcompany.commons.annotation.PlcUriIoC;
import com.powerlogic.jcompany.commons.config.stereotypes.SPlcMB;
import com.powerlogic.jcompany.config.aggregation.PlcConfigAggregation;
import com.powerlogic.jcompany.config.collaboration.FormPattern;
import com.powerlogic.jcompany.config.collaboration.PlcConfigForm;
import com.powerlogic.jcompany.config.collaboration.PlcConfigFormLayout;
import com.powerlogic.jcompany.controller.jsf.annotations.PlcHandleException;

@PlcConfigAggregation(
	entity = br.mil.eb.pqrmnt7.scc.entity.OrdemAbastecimentoEntity.class
)
@PlcConfigForm (
	formPattern=FormPattern.Man,
	formLayout = @PlcConfigFormLayout(dirBase="/WEB-INF/fcls/ordemabastecimento")
)
/**
 * Classe de Controle gerada pelo assistente
 */
@SPlcMB
@PlcUriIoC("ordemabastecimento")
@Named("ordemabastecimentoMB")
@PlcHandleException
public class OrdemAbastecimentoMB extends AppMB  {
	
	private static final Log logger = LogFactory.getLog(OrdemAbastecimentoMB.class);
	
	private static final long serialVersionUID = 1L;
	
	@Inject
	private IOrdemAbastecimento oaService;
	
	@Inject
	private MedicaoOdometroMB medicaoOdometroMB;
	
	/**
	* Entidade da ação injetado pela CDI
	*/
	@Produces  
	@Named("ordemabastecimento")
	public OrdemAbastecimentoEntity createEntityPlc() {
        if (this.entityPlc==null) {
              this.entityPlc = new OrdemAbastecimentoEntity();
              this.newEntity();
        }
        OrdemAbastecimentoEntity oa = (OrdemAbastecimentoEntity)this.entityPlc;
//        oa.setDataExpedicao(new Date());
//        oa.setSituacao(SituacaoOrdemDeAbastecimento.CRIADA);
//        oaDAO.findCount(contextUtil., null, null, null, null, null, null);
//		oa.setNumero(NUMERO_MAX_VALUE);
        return oa;
	}
	
	@Override
	public String save() {
		logger.debug("Método salvar em ordem de abastecimento:" + entityPlc);
		logger.debug("entityPlc:" + entityPlc.getClass().getCanonicalName());
		OrdemAbastecimento oa = (OrdemAbastecimento) entityPlc;
		logger.debug(oa.getDataExpedicao());
		
        try {
        	if (oa.getNumero()==null) {
        		logger.debug("Vai preparar a OrdemAbastecimento para ser criada: oa.getNumero()= " + oa.getNumero());
        		logger.debug("Vai preparar a OrdemAbastecimento para ser criada: oa.getSituacao()= " + oa.getSituacao());
        		oa.setNumero(oaService.proximoNumeroDeOrdem());
        		oa.setSituacao(SituacaoOrdemDeAbastecimento.CRIADA);
        		logger.debug("Preparou a OrdemAbastecimento para ser criada: oa.getNumero()= " + oa.getNumero());
        		logger.debug("Preparou a OrdemAbastecimento para ser criada: oa.getSituacao()= " + oa.getSituacao());
			} else 	if (oa.getMedicaoOdometro() != null && oa.getSituacao().equals(SituacaoOrdemDeAbastecimento.CONFIRMADA)) {
        		logger.debug("Vai preparar a medicao para ser criada " + oa.getMedicaoOdometro());
				MedicaoOdometro medicao = new MedicaoOdometroEntity();
				medicao.setValor(oa.getMedicaoOdometro());
				medicao.setDescricao("Valor informado a partir da Ordem de Abastecimento n° " + oa.getNumero());
				medicao.setData(oa.getDataAbastecimento());
				medicao.setViatura(oa.getViatura());
				logger.debug("Pronto para savar a medicao: " + medicao + ", medicaoOdometroMB: " + medicaoOdometroMB);
				medicaoOdometroMB.setEntityPlc(medicao);
				logger.debug("Setou a entidade...");
				String save = medicaoOdometroMB.save();
				logger.debug("Salvou: " + save);
			} else if (oa.getMedicaoOdometro() != null && oa.getSituacao().equals(SituacaoOrdemDeAbastecimento.CANCELADA)){
				oa.setVolumeAbastecido(null);
				oa.setDescricao(null);
				oa.setDataAbastecimento(null);
				oa.setMilitarQueAbasteceu(null);
				oa.setMilitarQueRecebeu(null);
				oa.setMedicaoOdometro(null);
			}
			return super.save();
		} catch (OrdemAbastecimentoException e) {
			e.printStackTrace();
			log.error(e);
			msgUtil.msgError("Erro ao gerar o numero da Ordem de Abastecimento.", new String[] { "" });
		}
        
        return null;
	}
	
	@Override
	public String search() {
		logger.debug("---------> Executou o search em Ordem de Abastecimento " + getClass().getName());
		return super.search();
	}
	
	@Override
	public void handleButtonsAccordingFormPattern() {
		logger.debug("---------------> Vai manipular os botões de " + getClass().getName());
		//Não funcionou, embora o método seja chamado :-/
//		visaoJsfUtil.hideAction(PlcConstants.ACAO.EVT_INCLUIR);
		visaoJsfUtil.hideAction("jcompany.evt.clonar");
		visaoJsfUtil.hideAction("jcompany.evt.excluir");
		visaoJsfUtil.hideAction("jcompany.evt.abrir");
		visaoJsfUtil.hideAction("jcompany.evt.novo");
		visaoJsfUtil.hideAction("jcompany.evt.incluir");
		visaoJsfUtil.hideAction("jcompany.evt.inserir");
		visaoJsfUtil.hideAction("jcompany.evt.imprimir");
		visaoJsfUtil.hideAction("jcompany.evt.VisualizaDocumento");
		visaoJsfUtil.hideAction("jcompany.evt.visualizadocumento");
		visaoJsfUtil.hideAction("jcompany.evt.visualiza_documento");
		visaoJsfUtil.hideAction("jcompany.evt.visualiza-documento");
		visaoJsfUtil.hideAction("jcompany.evt." + PlcConstants.ACAO.EVT_INCLUIR.toLowerCase());
		visaoJsfUtil.hideAction("jcompany.evt." + PlcConstants.ACAO.EVT_CLONAR);
		visaoJsfUtil.hideAction("jcompany.evt." + PlcConstants.ACAO.EVT_EXCLUIR);
		super.handleButtonsAccordingFormPattern();
	}

}
